﻿
namespace ApplicationGenerator.CommonModule
{
    /// <summary>
    /// Stałe używane przy generowaniu QuerryStringa
    /// </summary>
    public static class QuerryStringConstants
    {
        #region Forms
        /// <summary>
        /// Nazwa klucza przechowującego guid formularza
        /// </summary>
        public static string FormGuid = "FormGuid";

        /// <summary>
        /// Nazwa klucza przechowująca typ żadania wyświetlenia formularza
        /// </summary>
        public static string FormRequestType = "ElementType";

        /// <summary>
        /// Żądanie nowego elementu wyświetlanego na formularzu
        /// </summary>
        public static string FormRequestNew = "New";

        /// <summary>
        /// Żądanie zaczytanego elementu wyświetlanego na formularzu
        /// </summary>
        public static string FormRequestLoaded = "Loaded";

        public static string FormParentElementId = "ParentId";

        public static string FormRelationFieldName = "RelationName";
        #endregion

        #region Lists
        /// <summary>
        /// Nazwa klucza przechowującego guid listy
        /// </summary>
        public static string ListGuid = "ListGuid";

        /// <summary>
        /// Nazwa elementu stwierdzającego, czy można wybierać z listy wiele elementów
        /// </summary>
        public static string ListMultiselect = "Multiselect";

        /// <summary>
        /// Można wybierać wiele elementów z listy
        /// </summary>
        public static string ListMultiselectTrue = "true";

        /// <summary>
        /// Nie można wybierać wielu elementów z listy
        /// </summary>
        public static string ListMultiselectFalse = "false";
        #endregion

        #region ElementId
        /// <summary>
        /// Nazwa klucza przechowująca id elementu
        /// </summary>
        public static string ElementId = "ElementId";
        #endregion


        #region Workflow
        /// <summary>
        /// Nazwa klucza przechowującego guid workflow
        /// </summary>
        public static string WorkflowGuid = "WorkflowGuid";
        /// <summary>
        /// Nazwa klucza przechowująca typ workflow
        /// </summary>
        public static string WorkflowType = "WorkflowType";
        /// <summary>
        /// Nowy workflow
        /// </summary>
        public static string WorkflowTypeNew = "New";
        /// <summary>
        /// Kontynuacja workflow
        /// </summary>
        public static string WorkflowTypeContinue = "Continue";
        /// <summary>
        /// Odczytanie istniejącego workflow
        /// </summary>
        public static string WorkflowTypeLoad = "Load";

        #endregion

        #region Pages
        /// <summary>
        /// Strona do wyświetlania formularza
        /// </summary>
        public static string FormPage = "GeneratorPages/Form.aspx";
        /// <summary>
        /// Strona do wyświetlania list
        /// </summary>
        public static string ListPage = "GeneratorPages/List.aspx";
        /// <summary>
        /// Strona do wyświetlania elementu relacyjnego
        /// </summary>
        public static string RelationPage = "Relation.aspx";
        /// <summary>
        /// Strona do wyświetlania workflow
        /// </summary>
        public static string WorkflowPage = "GeneratorPages/Workflow.aspx";
        #endregion

        #region Methods
        /// <summary>
        /// Generuje url do formularza, na którym zostanie wyświetlony nowy element
        /// </summary>
        /// <param name="formVersion">Wersja formularza</param>
        /// <returns>Wygenerowany url</returns>
        public static string GenerateNewElementFormUrl(string formVersion)
        {
            return string.Format("~/{0}?{1}={2}&{3}={4}",
                FormPage, FormGuid, formVersion, FormRequestType, FormRequestNew);
        }

        /// <summary>
        /// Generuje url do formularza wyświetlającego zaczytany element
        /// </summary>
        /// <param name="formVersion">Wersja formularza</param>
        /// <param name="elementToNavigate">Element do wyświetlenia</param>
        /// <returns>Wygenerowany url</returns>
        public static string GenerateLoadElementFormUrl(string formVersion, int elementToNavigate)
        {
            return string.Format("~/{0}?{1}={2}&{3}={4}&{5}={6}",
                FormPage, FormGuid, formVersion, FormRequestType, FormRequestLoaded, ElementId, elementToNavigate);
        }

        /// <summary>
        /// Generuje url do formularza wyświetlającego zaczytany element
        /// </summary>
        /// <param name="workflowVersion">Wersja workflow</param>
        /// <param name="formVersion">Wersja formularza</param>
        /// <param name="elementToNavigate">Id wyświetlanego elementu</param>
        /// <returns>Wygenerowany url</returns>
        public static string GenerateLoadElementFormUrl(string workflowVersion, string formVersion, int elementToNavigate)
        {
            return string.Format("~/{0}?{1}={2}&{3}={4}&{5}={6}&{7}={8}",
                FormPage,
                FormGuid, formVersion,
                FormRequestType, FormRequestLoaded,
                WorkflowGuid, workflowVersion,
                ElementId, elementToNavigate);
        }

        /// <summary>
        /// Generuje url do wyświetlenia listy
        /// </summary>
        /// <param name="listVersion">Wersja listy</param>
        /// <returns>Wygenerowany url</returns>
        public static string GenerateListUrl(string listVersion)
        {
            return string.Format("~/{0}?{1}={2}", ListPage, ListGuid, listVersion);
        }

        /// <summary>
        /// Generuje url do wyświetlenia nowego workflow
        /// </summary>
        /// <param name="workflowVersion">Wersja workflow</param>
        /// <returns>Wygenerowany url</returns>
        public static string GenerateNewWorkflowUrl(string workflowVersion)
        {
            return string.Format("~/{0}?{1}={2}&{3}={4}", WorkflowPage, WorkflowGuid, workflowVersion, WorkflowType, WorkflowTypeNew);
        }

        /// <summary>
        /// Generuje url do wyświetlenia kontynuacji workflow
        /// </summary>
        /// <param name="workflowVersion">Wersja workflow</param>
        /// <param name="workflowInstanceId">Instancja workflow</param>
        /// <returns>Wygenerowany url</returns>
        public static string GenerateContinueWorkflowUrl(string workflowVersion, string workflowInstanceId)
        {
            return string.Format("~/{0}?{1}={2}&{3}={4}&{5}={6}", WorkflowPage, WorkflowGuid, workflowVersion, WorkflowType, WorkflowTypeContinue, ElementId, workflowInstanceId);
        }

        /// <summary>
        /// Generuje url do odczytu istniejącego workflow
        /// </summary>
        /// <param name="workflowVersion">Wersja workflow</param>
        /// <param name="workflowInstanceId">Instancja workflow</param>
        /// <returns>Wygenerowany url</returns>
        public static string GenerateLoadWorkflowUrl(string workflowVersion, string workflowInstanceId)
        {
            return string.Format("~/{0}?{1}={2}&{3}={4}&{5}={6}", WorkflowPage, WorkflowGuid, workflowVersion, WorkflowType, WorkflowTypeLoad, ElementId, workflowInstanceId);
        }


        /// <summary>
        /// Generuje url do strony ustawiania relacji
        /// </summary>
        /// <param name="listVersion">Wersja listy</param>
        /// <returns>Wygenerowany url</returns>
        public static string GenerateRelationPageUrl(string listVersion)
        {
            return string.Format("{0}?{1}={2}&{3}={4}", RelationPage, QuerryStringConstants.ListGuid, listVersion, QuerryStringConstants.ListMultiselect, QuerryStringConstants.ListMultiselectFalse);
        }

        /// <summary>
        /// Generuje url do strony ustawiania relacji pozwalając na wybór wielu elementów
        /// </summary>
        /// <param name="listVersion">Wersja listy</param>
        /// <returns>Wygenerowany url</returns>
        public static string GenerateMultiselectRelationPageUrl(string listVersion)
        {
            return string.Format("{0}?{1}={2}&{3}={4}", RelationPage, QuerryStringConstants.ListGuid, listVersion, QuerryStringConstants.ListMultiselect, QuerryStringConstants.ListMultiselectTrue);
        }

        public static string GenerateAddElementToListUrl(string formVersion, int parentId, string relationFieldName)
        {
            return string.Format("~/{0}?{1}={2}&{3}={4}&{5}={6}&{7}={8}",
                FormPage, FormGuid, formVersion, FormRequestType, FormRequestNew, FormParentElementId, parentId, FormRelationFieldName, relationFieldName);
        }
        #endregion

    }
}
